package com.tkm.types.smartCasts

var globalVar: String? = null

fun main() {
    val kotliner: Kotliner = Person("TKM", 24)
    //  Kotlin编译器认为kotliner是Kotliner类型，尽管用Person类实例化，但仍无法直接访问Person的内容
//    kotliner.doSomeThing()
    //  强制类型转换
//    (kotliner as Person).doSomething()


    //  已经判断类型后，可以智能转换类型
    //  判断类型仅限if作用域内
    if (kotliner is Person) {
        kotliner.doSomething()
    }

    //  智能类型转换的使用场景：nullable类型操作
    val str: String? = "Hello World"
    if (str != null) {
        val length = str.length
        println(length)
    }

    //  智能类型转换不适用于于顶级变量（多线程）
//    globalVar = "Hello"
//    if (globalVar != null) {
//        println(globalVar.length)
//    }

    //  使用局部变量引用顶级变量
    val innerVar = globalVar
    if (innerVar != null) {
        println(innerVar.length)
    }

    //  类型的安全转换，如果转换失败则为null
    //  person为Person?类型
    val person = kotliner as? Person
    person?.doSomething()
}
